El siguiente programa calcula el máximo de una secuencia de enteros acabada en -1:
#include <iostream> using namespace std; int main() { int n, max = -10; cin >> n; while (n != -1) { if (n > max) { max = n; } cin >> n; } }
El problema que tiene es que para una secuencia como:
-25 -35 -15 -1
Nos dirá que el máximo es -10. Claro, eso es porque hamos inicializado el máximo a -10 (pensando que sería el número más pequeño posible) y ha resultado que toda la secuencia estaba por debajo de ese valor. Para arreglarlo, podemos inicializar la variable max a -1000 y así se arregla.
Pero entonces, el programa, para la secuencia
-2002 -2003 -2005 -1999 -1
Dirá que el máximo es -1000 porque vuelve a ocurrir que lo hemos inicializado con un número que supera a todos los de la secuencia (y por tanto la suposición inicial no se revisa).
Ahora ya se ve claro que inicializar el máximo a -10000 o a otro número más negativo no funciona, porque siempre puedo encontrar una secuencia que esté enteramente por debajo.
Para resolver el problema es interesante preguntarse: "cual es el valor máximo de una secuencia con un número?". Porque la respuesta es: "el número mismo", si no hay más, ese es el máximo.
Entonces, cuando la secuencia empiece, y solo hayamos visto el primer número, podemos considerar que ése es el máximo y luego revisarlo si es necesario con los otros valores que vayan viniendo. Es decir:
int main() { int n, max; cin >> n; max = n; while (n != -1) { if (n > max) { max = n; } cin >> n; } }
En la tercera instrucción, asignamos el valor del primer entero de la secuencia al máximo y así, por el momento, será correcto. Esto nos immuniza de una inicialización con un valor arbitrario, porque los valores se comparan entre ellos, no con un valor escogido por nosotros.
La misma técnica nos sirve para calcular el mínimo de una secuencia. Basta con cambiar el nombre de max por min y luego cambiar la condición del if (de > a <) y el programa pasa a calcular el valor más pequeño. Eso es porque la forma de hacerlo es idéntica (incluyendo la inicialización), solamente cambian unos pocos detalles. El programa seria, entonces:
int main() { int n, min; cin >> n; min = n; while (n != -1) { if (n < min) { min = n; } cin >> n; } }
Escribe un programa que lea una secuencia de palabras (acabada en la palabra ".") e indique qué palabra es la primera por el orden del diccionario.
Escribe un programa que lea una secuencia de enteros acabada en -1 e indique en qué posición ocurre el máximo de la secuencia. La primera posición se considera que es la 1. Por ejemplo, en la secuencia:
1 2 3 4 5 4 3 2 1 -1
el máximo ocurre en la posición 5.
En preparación